package com.xyht.medicine_management_system.modules.order.util;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.xyht.medicine_management_system.common.util.TimeUtil;
import com.xyht.medicine_management_system.modules.order.constant.OrderConstant;
import com.xyht.medicine_management_system.modules.order.constant.OrderScheduleConstant;
import com.xyht.medicine_management_system.modules.order.entity.MmsOrderSchedule;
import com.xyht.medicine_management_system.modules.order.service.MmsOrderScheduleService;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import static com.xyht.medicine_management_system.common.util.ParamCheckUtil.isNullOrEmpty;

@Component
@Log4j2
public class OrderScheduleUtil {
    @Resource
    private MmsOrderScheduleService mmsOrderScheduleService;

    /**
     * 根据 订单进度(定时任务)类型 生成 相应定时任务
     *
     * @param orderId 订单id
     * @param type    进度类型(0.支付进度 1.发货进度 2.订单结束进度)
     * @param userId  用户id
     * @return 相应定时任务(生成失败返回 null)
     */
    public MmsOrderSchedule generateOrderScheduleByType(String orderId, Integer type, String userId) {
        MmsOrderSchedule orderSchedule = new MmsOrderSchedule();
        Date nowDate = new Date(); //当前时间
        if (isNullOrEmpty(userId)) {
            return null;
        }
        orderSchedule.setUserId(userId);
        if (isNullOrEmpty(orderId)) {
            return null;
        }
        orderSchedule.setOrderId(orderId);
        if (!OrderScheduleConstant.ORDER_SCHEDULE_TYPE_LIST.contains(type)) {
            return null;
        }
        orderSchedule.setType(type); //进度类型(0.支付进度 1.发货进度 2.订单结束进度)
        orderSchedule.setStartTime(nowDate); //状态开始时间

        //设置状态过期时间 和 当前订单状态
        switch (type) {
            case OrderScheduleConstant.ORDER_SCHEDULE_TYPE_PAYMENT: //支付进度
                orderSchedule.setExpireTime(TimeUtil.AddMinute(nowDate, OrderScheduleConstant.ORDER_SCHEDULE_PAYMENT_EXPIRATION_TIME_MINUTES));
                orderSchedule.setOrdersStatus(OrderConstant.ORDER_STATUS_TO_BE_PAID); //待支付
                break;
            case OrderScheduleConstant.ORDER_SCHEDULE_TYPE_DELIVERY: //发货进度
                orderSchedule.setExpireTime(TimeUtil.AddDays(nowDate, OrderScheduleConstant.ORDER_SCHEDULE_EXCEEDED_DELIVERY_TIME_DAYS));
                orderSchedule.setOrdersStatus(OrderConstant.ORDER_STATUS_TO_BE_DELIVERED); //待发货
                break;
            case OrderScheduleConstant.ORDER_SCHEDULE_TYPE_ORDER_END: //订单结束进度
                orderSchedule.setExpireTime(TimeUtil.AddDays(nowDate, OrderScheduleConstant.ORDER_SCHEDULE_ORDER_VALIDITY_TIME_DAYS));
                orderSchedule.setOrdersStatus(OrderConstant.ORDER_STATUS_TO_BE_DELIVERED); //待发货
                break;
        }

        orderSchedule.setIsClose(false); //状态是否结束
        boolean saveSuccess = mmsOrderScheduleService.save(orderSchedule);
        if (!saveSuccess) { //校验是否保存成功
            return null;
        }

        return orderSchedule;
    }

    /**
     * 根据 订单进度(定时任务)类型 生成 相应定时任务
     *
     * @param orderId   订单id
     * @param type      进度类型(0.支付进度 1.发货进度 2.订单结束进度)
     * @param userId    用户id
     * @param startDate 定时任务开始时间
     * @return 相应定时任务(生成失败返回 null)
     */
    public MmsOrderSchedule generateOrderScheduleByType(String orderId, Integer type, String userId, Date startDate) {
        MmsOrderSchedule orderSchedule = new MmsOrderSchedule();
        if (isNullOrEmpty(userId)) {
            return null;
        }
        orderSchedule.setUserId(userId);
        if (isNullOrEmpty(orderId)) {
            return null;
        }
        orderSchedule.setOrderId(orderId);
        if (!OrderScheduleConstant.ORDER_SCHEDULE_TYPE_LIST.contains(type)) {
            return null;
        }
        orderSchedule.setType(type); //进度类型(0.支付进度 1.发货进度 2.订单结束进度)
        orderSchedule.setStartTime(startDate); //状态开始时间

        //设置状态过期时间 和 当前订单状态
        switch (type) {
            case OrderScheduleConstant.ORDER_SCHEDULE_TYPE_PAYMENT: //支付进度
                orderSchedule.setExpireTime(TimeUtil.AddMinute(startDate, OrderScheduleConstant.ORDER_SCHEDULE_PAYMENT_EXPIRATION_TIME_MINUTES));
                orderSchedule.setOrdersStatus(OrderConstant.ORDER_STATUS_TO_BE_PAID); //待支付
                break;
            case OrderScheduleConstant.ORDER_SCHEDULE_TYPE_DELIVERY: //发货进度
                orderSchedule.setExpireTime(TimeUtil.AddDays(startDate, OrderScheduleConstant.ORDER_SCHEDULE_EXCEEDED_DELIVERY_TIME_DAYS));
                orderSchedule.setOrdersStatus(OrderConstant.ORDER_STATUS_TO_BE_DELIVERED); //待发货
                break;
            case OrderScheduleConstant.ORDER_SCHEDULE_TYPE_ORDER_END: //订单结束进度
                orderSchedule.setExpireTime(TimeUtil.AddDays(startDate, OrderScheduleConstant.ORDER_SCHEDULE_ORDER_VALIDITY_TIME_DAYS));
                orderSchedule.setOrdersStatus(OrderConstant.ORDER_STATUS_TO_BE_DELIVERED); //待发货
                break;
        }

        orderSchedule.setIsClose(false); //状态是否结束
        boolean saveSuccess = mmsOrderScheduleService.save(orderSchedule);
        if (!saveSuccess) { //校验是否保存成功
            return null;
        }

        return orderSchedule;
    }

    /**
     * 根据 订单id 获取 其进行中的定时任务集合
     *
     * @param orderId 订单id
     * @return 其进行中的定时任务集合(获取失败返回空集合)
     */
    public List<MmsOrderSchedule> getOrderScheduleList(String orderId) {
        List<MmsOrderSchedule> orderScheduleList = new ArrayList<>();
        if (isNullOrEmpty(orderId)) {
            return orderScheduleList;
        }

        //当前时间
        Date nowDate = new Date();
        orderScheduleList = mmsOrderScheduleService.list(new LambdaQueryWrapper<MmsOrderSchedule>()
                .eq(MmsOrderSchedule::getOrderId, orderId)
                .eq(MmsOrderSchedule::getIsClose, false) //定时任务未结束
                .le(MmsOrderSchedule::getStartTime, nowDate) //开始时间小于当前时间
                .ge(MmsOrderSchedule::getExpireTime, nowDate)); //过期时间大于当前时间

        return orderScheduleList;
    }

    /**
     * 根据 订单id 获取该订单存在某类型的定时任务数量
     *
     * @param orderId      订单id
     * @param scheduleType 定时任务类型
     * @return 定时任务数量(获取失败返回 - 1)
     */
    public int getOrderScheduleNum(String orderId, Integer scheduleType) {
        int count = -1;
        if (isNullOrEmpty(orderId, scheduleType)) {
            return count;
        }

        if (!OrderScheduleConstant.ORDER_SCHEDULE_TYPE_LIST.contains(scheduleType)) {
            return count;
        }

        count = mmsOrderScheduleService.count(new LambdaQueryWrapper<MmsOrderSchedule>()
                .eq(MmsOrderSchedule::getOrderId, orderId)
                .eq(MmsOrderSchedule::getType, scheduleType));

        return count;
    }

}
